﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using EntityLayer;
using BusinessLayer.Clases_Seguridad_BO;

namespace Tambini.Web
{
    public partial class OpcionForm : Page
    {
        //SeguridadLogic logic = new SeguridadLogic();
        clsOpcionBL negocioOpcion = new clsOpcionBL();
        List<t_opcion> treeItems;
        List<t_opcion> treeItemsChild;
        string idSeguridad = ConfigurationManager.AppSettings["Seguridad"];

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                Inicializar();
            }
        }

        public int CodigoOpcion
        {
            get
            {
                return (!string.IsNullOrEmpty(this.txtCodigo.Text)) ?
                    int.Parse(this.txtCodigo.Text) : 0;
            }
            set { this.txtCodigo.Text = value.ToString(); }
        }


        protected void Inicializar()
        {

            this.CargarArbol();
            desactivarRegistro();
            this.lblMensaje.Text = "Para ver el detalle de una opción, haga click en el arbol. Para crear una nueva opción, Marque el nivel al cual se agregará y luego presionar 'Nuevo'. ";
            this.pnlMensaje.CssClass = "content-message";
        }

        void desactivarRegistro()
        {
            txtNombre.Enabled = false;
            txtObjetivo.Enabled = false;
            txtUrl.Enabled = false;
            ddlEstado.Enabled = false;
            ddlOrden.Enabled = false;
            ddlTipo.Enabled = false;
            btnDescripcion.Enabled = false;
        }
        void activarRegistro()
        {

            txtNombre.Enabled = true;
            txtObjetivo.Enabled = true;
            txtUrl.Enabled = true;
            ddlEstado.Enabled = true;
            ddlOrden.Enabled = true;
            ddlTipo.Enabled = true;
            btnDescripcion.Enabled = true;
        }

        protected void tvOpciones_SelectedNodeChanged(object sender, EventArgs e)
        {
            try
            {
                if (this.tvOpciones.SelectedNode.Depth > 0)
                {
                    int idOpcion = int.Parse(this.tvOpciones.SelectedValue);
                    this.CargarDatoOpcion(idOpcion);
                    this.lblmsj.Text = String.Empty;
                    activarRegistro();
                }
                else
                {
                    lblmsj.Text = String.Empty;
                    lblmsj.Text = "No se puede eliminar el nodo principal !";
                    string script = "ShowSeleccionarOpcion()";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        protected void Grabar()
        {
            try
            {
                activarRegistro();
               
                clsOpcionBL negopcion=new clsOpcionBL();
                if (txtCodigo.Text == String.Empty)
                {
                    t_opcion entity = new t_opcion();
                    int id_opcion = negopcion.ObtenerIdOpcionMax();
                    entity.ID_OPCION = id_opcion;
                    entity.ID_PADRE = int.Parse(this.hfIdPadre.Value);
                    entity.IND_ESTADO = this.ddlEstado.SelectedItem.Text.Substring(0, 1);
                    entity.IND_TIPO = this.ddlTipo.SelectedItem.Text.Substring(0, 1);
                    entity.DES_OBJETIVO = this.txtObjetivo.Text;
                    entity.DES_DESCRIPCION = this.hteDescripcion.Html;
                    entity.DES_NOMBRE = this.txtNombre.Text;
                    entity.DES_URL = this.txtUrl.Text;
                    entity.USR_CREACION = ((t_usuario)Session[DatosSesion.User]).ID_USUARIO;
                    entity.NRO_ORDEN = int.Parse(this.ddlOrden.SelectedValue);
                    int idOpcion = negopcion.GrabarOpcion(entity);
                    this.CargarDatoOpcion(idOpcion);
                    this.CargarArbol();
                    string script = "ShowOK();";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }
                else
                {
                    t_opcion entity = new t_opcion();
                    entity.ID_OPCION = Convert.ToInt32(txtCodigo.Text);
                    entity.ID_PADRE = int.Parse(this.hfIdPadre.Value);
                    entity.IND_ESTADO = Convert.ToString(this.ddlEstado.SelectedItem.Value);
                    entity.IND_TIPO = this.ddlTipo.SelectedItem.Text.Substring(0, 1);
                    entity.DES_OBJETIVO = this.txtObjetivo.Text;
                    entity.DES_DESCRIPCION = this.hteDescripcion.Html;
                    entity.DES_NOMBRE = this.txtNombre.Text;
                    entity.DES_URL = this.txtUrl.Text;
                    //EntityLayer.t_usuario user = Session["SesionUser"] as EntityLayer.t_usuario;
                    //string useri = user.ID_USUARIO.ToString();
                    entity.USR_CREACION = ((t_usuario)Session["SesionUser"]).ID_USUARIO;
                    entity.NRO_ORDEN = int.Parse(this.ddlOrden.SelectedValue);
                    negocioOpcion.Modificar(entity);
                    //this.CargarDatoOpcion(idOpcion);
                    this.CargarArbol();
                    string script = "ShowModificar();";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }
            }
            catch (Exception ex)
            {
                lblmsj.Text = String.Empty;
                lblmsj.Text = "Error al grabar la opción !";
                string script = "ShowSeleccionarOpcion()";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
            }

        }


        protected void NuevoRegistro()
        {
            try
            {
                int contador = 0;
                int idPadre = 0;

                contador = ObtenerNodoRecursivo(this.tvOpciones, out idPadre);

                if (contador == 1)
                {
                    this.LimpiarCampos();
                    this.hfIdPadre.Value = idPadre.ToString();
                    this.CargarListaOrden(idPadre, false);
                    this.lblMensaje.Text = "Para ver el detalle de una opción, haga click en el arbol. Para crear una nueva opción, Marque el nivel al cual se agregará y luego presionar 'Nueva Opción'.";
                    this.pnlMensaje.CssClass = "content-message";
                }
                else
                {
                    lblmsj.Text = String.Empty;
                    lblmsj.Text = "Seleccione un nodo, donde agregará la opción !";
                    string script = "ShowSeleccionarOpcion()";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        private int ObtenerNodoRecursivo(TreeView tv, out int idPadre)
        {
            int contador = 0;
            int id = 0;
            foreach (TreeNode tn in tv.Nodes)
            {
                if (tn.Checked)
                {
                    contador++;
                    id = int.Parse(tn.Value);
                }

                if (tn.ChildNodes.Count > 0)
                {
                    foreach (TreeNode cTn in tn.ChildNodes)
                    {
                        contador = contador + ObtenerNodoHijoRecursivo(cTn, out idPadre);
                        if (idPadre > 0) id = idPadre;

                    }
                }
            }
            idPadre = id;
            return contador;
        }

        private int ObtenerNodoHijoRecursivo(TreeNode tn, out int idPadre)
        {
            int contador = 0;
            int id = 0;
            if (tn.Checked)
            {
                contador++;
                id = int.Parse(tn.Value);
            }
            if (tn.ChildNodes.Count > 0)
            {
                foreach (TreeNode tnC in tn.ChildNodes)
                {
                    contador = contador + ObtenerNodoHijoRecursivo(tnC, out idPadre);
                    if (idPadre > 0) id = idPadre;
                }
            }
            idPadre = id;
            return contador;
        }

        protected void LimpiarCampos()
        {
            this.txtCodigo.Text = string.Empty;
            this.txtObjetivo.Text = string.Empty;
            this.txtNombre.Text = string.Empty;
            this.txtUrl.Text = string.Empty;
            this.ddlEstado.SelectedIndex = -1;
            this.ddlTipo.SelectedIndex = -1;
            this.eDescripcion.Content = string.Empty;
            this.hfIdPadre.Value = string.Empty;
            this.btnDescripcion.Text = "Agregar Descripción";
        }


        protected void CargarDatoOpcion(int idOpcion)
        {
            try
            {
                t_opcion objEntity = negocioOpcion.ObtenerOpcionxId(idOpcion);
                if (negocioOpcion.ObtenerOpcionxId(idOpcion) != null)
                {
                    this.CodigoOpcion = idOpcion;
                    this.txtNombre.Text = objEntity.DES_NOMBRE;
                    this.txtObjetivo.Text = objEntity.DES_OBJETIVO;
                    this.eDescripcion.Content = objEntity.DES_DESCRIPCION;
                    this.txtUrl.Text = objEntity.DES_URL;
                    this.hfIdPadre.Value = objEntity.ID_PADRE.ToString();

                    if (this.ddlEstado.Items.FindByValue(objEntity.IND_ESTADO) != null)
                        this.ddlEstado.Value = objEntity.IND_ESTADO;
                    if (this.ddlTipo.Items.FindByValue(objEntity.IND_TIPO) != null)
                        this.ddlTipo.Value = objEntity.IND_TIPO;
                    this.CargarListaOrden(objEntity.ID_PADRE, true);

                    if (objEntity.NRO_ORDEN > 0)
                    {
                        ListItem liOrden = this.ddlOrden.Items.FindByValue(objEntity.NRO_ORDEN.ToString());
                        if (liOrden != null)
                        {
                            this.ddlOrden.SelectedValue = objEntity.NRO_ORDEN.ToString();
                        }
                    }

                    this.btnDescripcion.Text = "Ver Descripción";
                }
                else
                {
                    string script = "ShowSeleccionarOpcion();";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        protected void Eliminar()
        {
            if (!string.IsNullOrEmpty(this.txtCodigo.Text))
            {
                try
                {
                    t_opcion objOpcion = new t_opcion();
                    objOpcion = negocioOpcion.ObtenerOpcionxId(this.CodigoOpcion);

                    if (objOpcion.ID_PADRE != null)
                    {
                        bool flag = true;
                        
                        List<t_opcion> list = negocioOpcion.Listar();

                        foreach (t_opcion item in list)
                        {
                            if (item.ID_PADRE == this.CodigoOpcion)
                            {
                                flag = false;
                            }
                        }

                        if (flag)
                        {
                            t_opcion entity = new t_opcion();
                            objOpcion.ID_OPCION = this.CodigoOpcion;
                            negocioOpcion.EliminarOpcionGrupo(this.CodigoOpcion);
                            if (negocioOpcion.Eliminar(objOpcion))
                            {
                                this.tvOpciones.Nodes.Clear();
                                this.CargarArbol();
                                this.LimpiarCampos();
                                string script = "ShowEliminar();";
                                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                            }
                            else
                            {
                                lblmsj.Text = String.Empty;
                                lblmsj.Text = "No se puede eliminar la opción tiene dependencias !";
                                string script = "ShowSeleccionarOpcion()";
                                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                            }

                        }
                        else
                        {
                            lblmsj.Text = String.Empty;
                            lblmsj.Text = "No se puede eliminar la opción ya que existen opciones hijas.";
                            string script = "ShowSeleccionarOpcion()";
                            ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                        }
                    }
                    else
                    {
                        lblmsj.Text = String.Empty;
                        lblmsj.Text = "No se puede eliminar el nodo principal !";
                        string script = "ShowSeleccionarOpcion()";
                        ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                    }
                }
                catch (Exception)
                {

                    lblmsj.Text = String.Empty;
                    lblmsj.Text = "Error al eliminar la opción !";
                    string script = "ShowSeleccionarOpcion()";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
                }
            }
            else
            {
                lblmsj.Text = String.Empty;
                lblmsj.Text = "Seleccione una opción para eliminar !";
                string script = "ShowSeleccionarOpcion()";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
            }
        }


        protected void CargarArbol()
        {
            this.tvOpciones.Nodes.Clear();
            try
            {

                treeItems = negocioOpcion.Listar();
                if (treeItems.Count > 0)
                {
                    this.LlenarOpciones(null, null, this.tvOpciones);
                }

                this.tvOpciones.ExpandAll();
            }
            catch
            {

            }
        }

        public void LlenarOpciones(int? codigoPadre, TreeNode node, TreeView tree)
        {
            treeItemsChild = treeItems.FindAll(delegate(t_opcion item) { return (item.ID_PADRE == codigoPadre); });

            foreach (t_opcion hijos in treeItemsChild)
            {
                TreeNode newNode = new TreeNode(hijos.DES_NOMBRE, hijos.ID_OPCION.ToString());
                if (codigoPadre == null) tree.Nodes.Add(newNode);
                else node.ChildNodes.Add(newNode);
                this.LlenarOpciones(hijos.ID_OPCION, newNode, null);
            }
        }

        protected void CargarListaOrden(int? idPadre, bool flagEdicion)
        {
            this.ddlOrden.Items.Clear();
            try
            {
                int ordenMax = negocioOpcion.ObtenerNroElementosPorNodo(idPadre);
                ordenMax = (!flagEdicion) ? ordenMax++ : ordenMax;

                for (int i = 1; i <= ordenMax; i++)
                {
                    this.ddlOrden.Items.Add(new ListItem(i.ToString(), i.ToString()));
                }

                if (!flagEdicion)
                {
                    this.ddlOrden.Items.Add(new ListItem((ordenMax + 1).ToString(), (ordenMax + 1).ToString()));
                    this.ddlOrden.SelectedValue = (ordenMax + 1).ToString();
                }
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        protected void btnNuevoV2_Click(object sender, EventArgs e)
        {
            activarRegistro();
            this.NuevoRegistro();
        }

        protected void btnGrabarv2_Click(object sender, EventArgs e)
        {
            if (txtNombre.Text == String.Empty || ddlEstado.SelectedIndex == 0 || ddlTipo.SelectedIndex == 0)
            {
                string script = "ShowVacios();";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
            }
            else
            {
                this.Grabar();
            }

        }

        protected void btnEliminarv2_Click(object sender, EventArgs e)
        {
            if (txtCodigo.Text == String.Empty)
            {
                lblmsj.Text = String.Empty;
                lblmsj.Text = "Seleccione una opción del Arbol !";
                string script = "ShowSeleccionarOpcion();";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);
            }
            else
            {
                string script = "popupConfirmar.Show();";
                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", script, true);

            }

        }

        protected void btnSalirv2_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Index.aspx?id=" + Request["id"].ToString());
        }

        protected void btnEliminarOk_Click(object sender, EventArgs e)
        {
            this.Eliminar();
        }

    }
}